package com.sssre.business.service.impl;
import java.math.BigDecimal;
import java.util.Date;

import com.sssre.business.domain.BusAppointment;
import com.sssre.business.domain.BusStatement;
import com.sssre.business.domain.BusStatementItem;
import com.sssre.business.exception.ServiceValidException;
import com.sssre.business.mapper.BusAppointmentMapper;
import com.sssre.business.mapper.BusStatementItemMapper;
import com.sssre.business.mapper.BusStatementMapper;
import com.sssre.business.service.IBusStatementItemService;
import com.sssre.business.vo.BusStatementItemVO;
import com.sssre.common.utils.SecurityUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;

/**
 * 结算单明细Service业务层处理
 *
 * @author 浪兎兎
 * @date 2025-04-29
 */
@Service
@Slf4j
public class BusStatementItemServiceImpl implements IBusStatementItemService {
    @Autowired
    private BusStatementItemMapper busStatementItemMapper;
    @Autowired
    private BusStatementMapper busStatementMapper;
    @Autowired
    private BusAppointmentMapper busAppointmentMapper;

    /**
     * 查询结算单明细
     *
     * @param id 结算单明细主键
     * @return 结算单明细
     */
    @Override
    public BusStatementItem selectBusStatementItemById(Long id) {
        return busStatementItemMapper.selectBusStatementItemById(id);
    }

    /**
     * 查询结算单明细列表
     *
     * @param busStatementItem 结算单明细
     * @return 结算单明细
     */
    @Override
    public List<BusStatementItem> selectBusStatementItemList(BusStatementItem busStatementItem) {
        return busStatementItemMapper.selectBusStatementItemList(busStatementItem);
    }

    /**
     * 新增结算单明细
     *
     * @param busStatementItem 结算单明细
     * @return 结果
     */
    @Override
    public int insertBusStatementItem(BusStatementItem busStatementItem) {
        return busStatementItemMapper.insertBusStatementItem(busStatementItem);
    }

    /**
     * 修改结算单明细
     *
     * @param busStatementItem 结算单明细
     * @return 结果
     */
    @Override
    public int updateBusStatementItem(BusStatementItem busStatementItem) {
        return busStatementItemMapper.updateBusStatementItem(busStatementItem);
    }

    /**
     * 批量删除结算单明细
     *
     * @param ids 需要删除的结算单明细主键
     * @return 结果
     */
    @Override
    public int deleteBusStatementItemByIds(Long[] ids) {
        return busStatementItemMapper.deleteBusStatementItemByIds(ids);
    }

    /**
     * 删除结算单明细信息
     *
     * @param id 结算单明细主键
     * @return 结果
     */
    @Override
    public int deleteBusStatementItemById(Long id) {
        return busStatementItemMapper.deleteBusStatementItemById(id);
    }

    /**
     * 保存结算单
     *
     * @param busStatementItemVO 保存的明细vo
     * @param id       被保存的结算单
     * @return 结果
     */
    @Override
    @Transactional
    public int save(BusStatementItemVO busStatementItemVO, Long id) {
        if (busStatementItemVO == null) {
            throw new ServiceValidException("数据不能为空");
        }
        // 列表
        List<BusStatementItem> itemList = busStatementItemVO.getItemList();
        // 优惠价
        BigDecimal discountAmount = busStatementItemVO.getDiscountAmount();
        // 判断数据是否为空
        if (itemList == null || itemList.size() == 0 || discountAmount == null || id == null) throw new ServiceValidException("数据不能为空");
        // 校验数据合法性时，获取总价，总数量
        BigDecimal totalPrice = new BigDecimal("0");
        BigDecimal totalQuantity = new BigDecimal("0");
        for (BusStatementItem item : itemList) {
            if (item == null
                    || item.getItemName() == null
                    || item.getItemPrice() == null
                    || item.getItemPrice().intValue() < 0
                    || item.getItemQuantity() == null
                    || item.getItemQuantity().intValue() <= 0
                    || item.getStatementId() == null) {
                throw new ServiceValidException("非法参数");
            }
            totalPrice = totalPrice.add(item.getItemPrice().multiply(item.getItemQuantity()));
            totalQuantity = totalQuantity.add(item.getItemQuantity());
        }
        // 根据 id 查询原始对象
        BusStatement busStatement = busStatementMapper.selectBusStatementById(id);
        if (busStatement == null) {
            throw new ServiceValidException("结算单不存在");
        }
        // 状态合理化验证
        Integer status = busStatement.getStatus();
        if (status.equals(BusStatement.DELETED)) {
            throw new ServiceValidException("已支付的结算单不能修改");
        }
        // 先根据结算单 id 批量删除
        busStatementItemMapper.batchDeleteByStatementId(id);
        // 然后批量插入数据
        busStatementItemMapper.batchInsert(itemList);
        // 判断优惠价是否大于总价
        if (discountAmount.intValue() > totalPrice.intValue() || discountAmount.intValue() < 0) {
            throw new ServiceValidException("优惠价不能大于总价格");
        }
        // 然后修改总价、优惠价、数量
        busStatement.setTotalAmount(totalPrice);
        busStatement.setTotalQuantity(totalQuantity);
        busStatement.setDiscountAmount(discountAmount);
        busStatementMapper.updateBusStatement(busStatement);
        return 1;
    }

    /**
     * 支付结算单
     *
     * @param id 被保存的结算单
     * @return 结果
     */
    @Override
    @Transactional
    public int pay(BusStatementItemVO busStatementItemVO, Long id) {
        // 校验数据合法性
        BusStatement busStatement = busStatementMapper.selectBusStatementById(id);
        save(busStatementItemVO, id);
        // 获取用户id
        Long userId = SecurityUtils.getUserId();
        // 设置收款人id和状态
        busStatement.setStatus(BusStatement.STATUS_PAID);
        busStatement.setPayeeId(userId);
        busStatement.setPayTime(new Date());
        // 上传数据
        int count = busStatementMapper.updateBusStatement(busStatement);
        // 如果绑定了预约单id，那么修改状态
        if (busStatement.getAppointmentId() != null) {
            busAppointmentMapper.updateStatus(BusAppointment.STATUS_PAID, busStatement.getAppointmentId());
        }
        return count;
    }
}
